package com.nageoffer.shortlink.admin.remote;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.nageoffer.shortlink.admin.common.convention.result.Result;
import com.nageoffer.shortlink.admin.config.OpenFeignConfiguration;
import com.nageoffer.shortlink.admin.dto.req.RecycleBinRecoverReqDTO;
import com.nageoffer.shortlink.admin.dto.req.RecycleBinRemoveReqDTO;
import com.nageoffer.shortlink.admin.dto.req.RecycleBinSaveReqDTO;
import com.nageoffer.shortlink.admin.remote.dto.req.ShortLinkBatchCreateReqDTO;
import com.nageoffer.shortlink.admin.remote.dto.req.ShortLinkCreateReqDTO;
import com.nageoffer.shortlink.admin.remote.dto.req.ShortLinkUpdateReqDTO;
import com.nageoffer.shortlink.admin.remote.dto.resp.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 短链接中台远程调用服务
 */
@FeignClient(
        value = "short-link-project",
        url = "${aggregation.remote-url:}",
        configuration = OpenFeignConfiguration.class
)
public interface ShortLinkActualRemoteService {

    /**
     * 创建短链接
     * @param requestParam 创建短链接请求参数
     * @ 创建短链接响应
     */
    @PostMapping("/api/short-link/v1/create")
    Result<ShortLinkCreateRespDTO> creatShortLink(@RequestBody ShortLinkCreateReqDTO requestParam);

    /**
     * 批量创建短链接
     * @param requestParam 请求参数
     * @return 响应参数
     */
    @PostMapping("/api/short-link/v1/create/batch")
    Result<ShortLinkBatchCreateRespDTO> creatShortLinkBatch(@RequestBody ShortLinkBatchCreateReqDTO requestParam);

    /**
     * 修改短链接
     * @param requestParam 修改短链接请求参数
     */
    @PutMapping("/api/short-link/v1/update")
    void updateShortLink(@RequestBody ShortLinkUpdateReqDTO requestParam);

    /**
     * 短链接分页查询
     * @param gid 唯一标识
     * @param orderTag 排序标识
     * @param size 页码
     * @param current 位置
     */
    @GetMapping("/api/short-link/v1/page")
    Result<Page<ShortLinkPageRespDTO>> pageShortLink(@RequestParam("gid") String gid,
                                                     @RequestParam("orderTag") String orderTag,
                                                     @RequestParam("size") Long size,
                                                     @RequestParam("current") Long current);

    /**
     * 查询分组短链接总量
     * @param requestParam 分组短链接总量请求参数
     * @return 分组短链接总量响应参数
     */
    @GetMapping("/api/short-link/v1/count")
    Result<List<ShortLinkCountQueryRespDO>> listGroupShortLinkCount(@RequestParam("requestParam") List<String> requestParam);

    /**
     * 根据url获取标题
     * @param url 目标网站地址
     * @return 网站标题
     */
    @GetMapping("/api/short-link/v1/title")
    Result<String> getTitleByUrl(@RequestParam("url") String url);

    /**
     * 保存回收站
     */
    @PostMapping("/api/short-link/v1/recycle-bin/save")
    void saveRecycleBin(@RequestBody RecycleBinSaveReqDTO requestParam);

    /**
     * 删除短链接
     * @param requestParam 请求参数
     */
    @PostMapping("/api/short-link/v1/recycle-bin/remove")
    void removeRecycleBin(@RequestBody RecycleBinRemoveReqDTO requestParam);

    /**
     * 恢复短链接
     * @param requestParam 请求参数
     */
    @PostMapping("/api/short-link/v1/recycle-bin/recover")
    void reserveRecycleBin(@RequestBody RecycleBinRecoverReqDTO requestParam);

    /**
     * 分页查询回收站短链接
     * @param gidList 分页标识
     * @param size 页码
     * @param current 位置
     * @return 分页查询短链接响应
     */
    @GetMapping("/api/short-link/v1/recycle-bin/page")
    Result<Page<ShortLinkPageRespDTO>> pageRecycleBinShortLink(
            @RequestParam("gidList") List<String> gidList,
            @RequestParam("size") long size,
            @RequestParam("current") long current
    );

    /**
     * 根据短链接查询指定时间内监控数据
     * @param fullShortUrl 完整短链接
     * @param gid 分组标识
     * @param endDate 结束时间
     * @param startDate 开始时间
     */
    @GetMapping("/api/short-link/v1/stats")
    Result<ShortLinkStatsRespDTO> oneShortLinkStats(
            @RequestParam("fullShortUrl") String fullShortUrl,
            @RequestParam("gid") String gid,
            @RequestParam("endDate") String endDate,
            @RequestParam("startDate") String startDate,
            @RequestParam("enableStatus") Integer enableStatus
    );

    /**
     * 访问分组链接在指定时间内监控数据
     * @param gid 分组标识
     * @param startDate 开始时间
     * @param endDate 结束时间
     */
    @GetMapping("/api/short-link/v1/stats/group")
    Result<ShortLinkStatsGroupRespDTO> groupShortLinkStats(
            @RequestParam("gid") String gid,
            @RequestParam("startDate") String startDate,
            @RequestParam("endDate") String endDate
    );

    /**
     * 访问单个链接在指定时间内访问记录监控数据
     * @param fullShortUrl 完整短链接
     * @param gid 分组标识
     * @param endDate 结束时间
     * @param startDate 开始时间
     */
    @GetMapping("/api/short-link/v1/stats/access-record")
    Result<Page<ShortLinkStatsAccessRecodeRespDTO>> shortLinkStatsAccessRecord(
            @RequestParam("fullShortUrl") String fullShortUrl,
            @RequestParam("gid") String gid,
            @RequestParam("startDate") String startDate,
            @RequestParam("endDate") String endDate,
            @RequestParam("enableStatus") Integer enableStatus,
            @RequestParam("current") Long current,
            @RequestParam("size") Long size
    );

    /**
     * 访问分组链接在指定时间内访问记录监控数据
     * @param gid 分组标识
     * @param startDate 开始时间
     * @param endDate 结束时间
     */
    @GetMapping("/api/short-link/v1/stats/access-record/group")
    Result<Page<ShortLinkGroupStatsAccessRecodeRespDTO>> groupShortLinkStatsAccessRecord(
            @RequestParam("gid") String gid,
            @RequestParam("startDate") String startDate,
            @RequestParam("endDate") String endDate,
            @RequestParam("current") Long current,
            @RequestParam("size") Long size
    );
}
